import { sep } from 'node:path'
import { fileURLToPath, URL } from 'node:url'
import { accessSync, readdirSync } from 'node:fs'

export const resolve = (src: string) => fileURLToPath(new URL(`../${src}`, import.meta.url))

export const getSep = (src: string) => resolve(src).split(sep).join('/')

interface AccessType {
  name: string
  dir: string
  extensions: string[]
}
const access = ({ name, dir, extensions }: AccessType) => {
  const paths = ['/Index', '/index', `/${name}`].reduce(
    (t: string[], o: string) => [...t, ...extensions.map((r) => `${o}.${r}`)],
    [],
  )

  for (const path of paths) {
    try {
      accessSync(`${getSep('src')}/${dir}/${name}${path}`)
      return path
    } catch {}
  }
  return undefined
}

// 解决 nodejs 大小写不敏感不能正确读取路径，vite 的自动导入组件不能热更新
interface PathParams {
  folder: string
}
export const getPath = (parentPath: string, { folder }: PathParams) => {
  try {
    const files = readdirSync(parentPath)
    for (const file of files) {
      if (file.toLowerCase() === folder) {
        return `${parentPath}/${file}`
      }
    }
  } catch {}
  throw new Error(`${parentPath}/${folder} is exist?`)
}

export const setResolve = (name: string, { prefix = 'Eo', dir = 'components' } = {}) => {
  const partialName = name.slice(prefix.length)
  const path = access({ name: partialName, dir, extensions: ['vue', 'js'] }) || '.vue'
  return `${getSep('src')}/${dir}/${partialName}${path}`
}

// resolver
export const layoutsResolver = () => (name: string) => {
  if (name.startsWith('Layout')) {
    return setResolve(name, { prefix: 'Layout', dir: 'layouts' })
  }
}

export const injectProcessEnv = (env: Record<string, string>) => {
  Object.keys(env).forEach((key) => {
    if (env[key]) {
      process.env[key] = env[key]
    }
  })
}
